package code.whmmm.util.collection;

import code.whmmm.util.simple.JavaWarning;
import code.whmmm.util.simple.ValueWrapper;

import java.util.HashMap;
import java.util.Map;

/**
 * <p><b>
 *
 * </b></p>
 * <br/>
 * 创建时间: 9/19/2019 11:54 AM
 *
 * @author Zero
 */
public class WrappedMap<K, V> extends HashMap<K, V> {

    public WrappedMap() {
        super();
    }

    public WrappedMap(int initSize) {
        super(initSize);
    }

    /**
     * 根据 map ，创建 WrappedMap ，会使用循环遍历
     *
     * @param hashMap
     * @param <K>
     * @param <V>
     * @return
     */
    public static <K, V> WrappedMap<K, V> create(Map<K, V> hashMap) {
        WrappedMap<K, V> map = new WrappedMap<K, V>(hashMap.size());
        for (K k : hashMap.keySet()) {
            map.put(k, hashMap.get(k));
        }

        return map;
    }

    /**
     * 如果 值 为 null ,返回  ""
     *
     * @param key 键
     * @return string
     */
    public String getString(Object key) {
        return ValueWrapper.getString(
                get(key)
        );
    }

    /**
     * 如果 为 null 则返回 0 !
     *
     * @param key 键
     * @return int
     */
    public int getInt(Object key) {
        return ValueWrapper.getInt(
                get(key)
        );
    }

    /**
     * 为 null 返回 0L
     *
     * @param key 键
     * @return 值
     */
    public long getLong(Object key) {
        return ValueWrapper.getLong(get(key));
    }

    /**
     * 为 null 返回 0L
     *
     * @param key 键
     * @return 值
     */
    public double getDouble(Object key) {
        return ValueWrapper.getDouble(
                get(key)
        );
    }

    /**
     * 为 null 返回 0L
     *
     * @param key 键
     * @return 值
     */
    public float getFloat(Object key) {
        return ValueWrapper.getFloat(get(key));
    }

    /**
     * 获取对象 , 非常可能报错!!!...请不要使用此方法
     *
     * @param key    键
     * @param tClass 类字节码
     * @param <T>    类型
     * @return T instance
     */
    @SuppressWarnings(JavaWarning.UNCHECKED)
    public <T> T getObject(Object key, Class<T> tClass) {
        Object o = get(key);

        return (T) o;
    }

    /**
     * 如果 对应的键值为空,那么返回 defaultValue
     *
     * @param <T>          类型
     * @param k            键
     * @param defaultValue 默认值
     * @return
     */
    @SuppressWarnings(JavaWarning.UNCHECKED)
    public <T> T get(Object k, T defaultValue) {
        T v = (T) this.get(k);
        if (v == null) {
            v = defaultValue;
        }
        return v;
    }


    public V getNotNull(Object key) {
        V v = this.get(key);
        if (v == null) {
            v = this.get("default_not_null_value");
        }
        return v;
    }


}
